#include <stdio.h>

// #define OFFSETOF(type , member) (size_t)&(((type*)0)->member)
//
// struct S
// {
//     char c1;
//     int i;
//     char c2;
// };
//
// int main(void)
// {
//     printf("%d\n",OFFSETOF(struct S, c1));
//     printf("%d\n",OFFSETOF(struct S, i));
//     printf("%d\n",OFFSETOF(struct S, c2));
//     return 0;
// }
//
//
// #define SWAP(x) (x=(((x&0x55555555)<<1)+((x&0xaaaaaaaaa)>>1)))
//
// int main()
// {
//     int a = 10;
//     SWAP(a);
//     printf("%d\n",a);
//     return 0;
// }

void FindSingle(int arr[],int sz,int single[])
{
    int ret = 0;
    int i = 0;
    for(i=0; i<sz; i++)
    {
        ret = ret^arr[i];
    }
    //ret = 5^6 = ....011
    int pos = 0;
    for(i=0; i<32; i++)
    {
        if(((ret>>i)&1)==1)
        {
            pos = i;
            break;
        }
        //5和6第pos位不相同
    }
    for(i=0; i<sz; i++)//遍历数组找第pos位为1，放一个组里
    {
        if (((arr[i]>>pos)&1)==1)
        {
            single[0] ^= arr[i];
            //相同的异或就没了，只剩pos位为1里不同的那个
        }
        else
        {
            single[1] ^= arr[i];
        }
    }
}

int main()
{
    int arr[]={1,2,3,4,5,1,2,3,4,6};
    int i = 0;
    int sz = sizeof(arr)/sizeof(arr[0]);
    int single[2] = {0};

    FindSingle(arr, sz, single);

    printf("%d %d\n",single[0],single[1]);
    return 0;
}





























